/* eslint-env node */
const electron = require('electron');
const { app, BrowserWindow, protocol } = require('electron');
const { dirname, join, resolve } = require('path');
const protocolServe = require('electron-protocol-serve');
const {ipcMain} = require('electron');
const fse = require('fs-extra');
const fs = require('fs');


let mainWindow = null;

process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = true;


// Registering a protocol & schema to serve our Ember application
protocol.registerStandardSchemes(['serve'], { secure: true });
protocolServe({
  cwd: join(__dirname || resolve(dirname('')), '..', 'ember'),
  app,
  protocol,
});

// Uncomment the lines below to enable Electron's crash reporter
// For more information, see http://electron.atom.io/docs/api/crash-reporter/
// electron.crashReporter.start({
//     productName: 'YourName',
//     companyName: 'YourCompany',
//     submitURL: 'https://your-domain.com/url-to-submit',
//     autoSubmit: true
// });

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('ready', () => {
  const {width, height} = electron.screen.getPrimaryDisplay().workAreaSize;
  mainWindow = new BrowserWindow({
    width: width,
    height: height,
  });

  // If you want to open up dev tools programmatically, call
  // mainWindow.openDevTools();

  const emberAppLocation = 'serve://dist';

  // Load the ember application using our custom protocol/scheme
  mainWindow.loadURL(emberAppLocation);

  // If a loading operation goes wrong, we'll send Electron back to
  // Ember App entry point
  mainWindow.webContents.on('did-fail-load', () => {
    mainWindow.loadURL(emberAppLocation);
  });

  mainWindow.webContents.on('crashed', () => {
    console.log('Your Ember app (or other code) in the main window has crashed.');
    console.log('This is a serious issue that needs to be handled and/or debugged.');
  });

  mainWindow.on('unresponsive', () => {
    console.log('Your Ember app (or other code) has made the window unresponsive.');
  });

  mainWindow.on('responsive', () => {
    console.log('The main window has become responsive again.');
  });

  mainWindow.on('closed', () => {
    mainWindow = null;
  });


});

// Handle an unhandled error in the main thread
//
// Note that 'uncaughtException' is a crude mechanism for exception handling intended to
// be used only as a last resort. The event should not be used as an equivalent to
// "On Error Resume Next". Unhandled exceptions inherently mean that an application is in
// an undefined state. Attempting to resume application code without properly recovering
// from the exception can cause additional unforeseen and unpredictable issues.
//
// Attempting to resume normally after an uncaught exception can be similar to pulling out
// of the power cord when upgrading a computer -- nine out of ten times nothing happens -
// but the 10th time, the system becomes corrupted.
//
// The correct use of 'uncaughtException' is to perform synchronous cleanup of allocated
// resources (e.g. file descriptors, handles, etc) before shutting down the process. It is
// not safe to resume normal operation after 'uncaughtException'.
process.on('uncaughtException', (err) => {
  console.log('An exception in the main thread was not handled.');
  console.log('This is a serious issue that needs to be handled and/or debugged.');
  console.log(`Exception: ${err}`);
});

process.on('unhandledRejection', (reason, p) => {
  console.log('Unhandled Rejection at:', p, 'reason:', reason);
  // application specific logging, throwing an error, or other logic here
});

// 文件保存在用户应用目录：/Users/ubuntuvim/Library/Application Support/Electron（macOS）
const ufile = app.getPath('userData') + '/plan-todos/data.json';
console.log("文件保存路径：" + ufile);
//创建文件
fse.ensureFile(ufile, err => {
  console.log("文件"+ufile+"创建失败：\n" + err);
});

// 保存web页面发送过来的数据
ipcMain.on('todos-data', (event, data) => {
  console.log('web发送过来的数据: ' + data);
  // 持久化数据到本地json文件中
  if (data) {
    // fse.writeJson(ufile, data);
    fs.writeFileSync(ufile, data, 'utf8');
  }
  console.log("主线程数据写入完毕。。。");
});

// 同步方式返回数据到web
ipcMain.on('synchronous-message', (event, arg) => {
  console.log(arg);
  event.returnValue = fs.readFileSync(ufile, 'utf8');
});

/**
 * 读取json文件
 * @unuse
 */
function readJsonFile(file) {
  try {
    const data = fse.readJson(file);
    console.log('数据加载完毕...' + data);
    return data;
  } catch (err) {
    console.error("数据加载失败：" + err);
  }
}
